<?php
if (!defined('MSD_VERSION')) die('No direct access.');

//SQL-Library laden
include('./inc/sqllib.php');

if(!isset($config['sql_limit'])) $config['sql_limit']=30;
if(!isset($config['bb_width'])) $config['bb_width']=300;
if(!isset($config['bb_textcolor'])) $config['bb_textcolor']="#990033";

function ReadSQL()
{
	global $SQL_ARRAY,$config;
	$sf=$config['paths']['config'].'sql_statements';
	if(!is_file($sf)){
		$fp=fopen($sf,"w+");
		fclose($fp);
		@chmod($sf,0775);
	}
	if(count($SQL_ARRAY)==0 && filesize($sf)>0) {
		$SQL_ARRAY=file($sf);
	}
}
function WriteSQL()
{
	global $SQL_ARRAY,$config;
	$sf=$config['paths']['config'].'sql_statements';
	$str="";
	for($i=0;$i<count($SQL_ARRAY);$i++) {
		$str.=$SQL_ARRAY[$i];
		if(substr($str,-1)!="\n" && $i!=(count($SQL_ARRAY)-1)) $str.="\n";

	}
	if ($config['magic_quotes_gpc']) $str=stripslashes($str);
	$fp=fopen($sf,"wb");
	fwrite($fp,$str);
	fclose($fp);

}
function SQL_Name($index)
{
	global $SQL_ARRAY;
	$s=explode("|",$SQL_ARRAY[$index]);
	return $s[0];
}
function SQL_String($index)
{
	global $SQL_ARRAY;
	if(isset($SQL_ARRAY[$index]) && !empty($SQL_ARRAY[$index])) {
		$s=explode("|",$SQL_ARRAY[$index]);
		return (isset($s[1])) ? $s[1] : "";
	}
}
function SQL_ComboBox()
{
	global $SQL_ARRAY,$tablename,$nl;
	$s='';
	if(count($SQL_ARRAY)>0)
	{
		$s=$nl.$nl.'<select class="SQLCombo" name="sqlcombo" onchange="this.form.sqltextarea.value=this.options[this.selectedIndex].value;">'.$nl;
		$s.='<option value="" selected>---</option>'.$nl;
		for($i=0;$i<count($SQL_ARRAY);$i++)
		{
			$s.='<option value="'.stripslashes(SQL_String($i)).'">'.SQL_Name($i).'</option>'.$nl;
		}
		$s.='</select>'.$nl.$nl;
	}
	return $s;
}

function Table_ComboBox()
{
	global $db,$config,$lang,$nl;
	$tabellen = mysql_query("SHOW TABLES FROM `$db`",$config['dbconnection']);
	$num_tables = mysql_num_rows($tabellen);
	$s=$nl.$nl.'<select class="SQLCombo" name="tablecombo" onchange="this.form.sqltextarea.value=this.options[this.selectedIndex].value;this.form.execsql.click();">'.$nl.'<option value="" selected> ---  </option>'.$nl;
	for($i=0;$i<$num_tables;$i++) {
		$t=mysql_fetch_row($tabellen);
		$s.='<option value="SELECT * FROM `'.$db.'`.`'.$t[0].'`">'.$lang['table'].' `'.$t[0].'`</option>'.$nl;
	}
	$s.='</select>'.$nl.$nl;
	return $s;
}
function TableComboBox($default='')
{
	global $db,$config,$lang,$nl;
	$tabellen = mysql_list_tables($db,$config['dbconnection']);
	$num_tables = mysql_num_rows($tabellen);
	$s='<option value="" '.(($default=="") ? 'selected' : '').'>                 </option>'.$nl;
	for($i=0;$i<$num_tables;$i++) {
		$t=mysql_tablename($tabellen,$i);
		$s.='<option value="`'.$t.'`"'.(($default=='`'.$t.'`') ? 'selected' : '').'>`'.$t.'`</option>'.$nl;
	}
	return $s;
}
function DB_Exists($db)
{
	global $config;
	if(!isset($config['dbconnection'])) MSD_mysql_connect();
	$erg=false;
	$dbs=mysql_list_dbs($config['dbconnection']);
	while ($row = mysql_fetch_object($dbs)) {
		if(strtolower($row->Database)==strtolower($db)) {
			$erg=true;break;
		}
	}
	return $erg;
}
function Table_Exists($db,$table)
{
	global $config;
	if(!isset($config['dbconnection'])) MSD_mysql_connect();
	$sqlt="SHOW TABLES FROM `$db`";
	$res=MSD_query($sqlt) or die(SQLError($sqlt,mysql_error()));
	if($res)
	{
		$tables=array();
		WHILE ($row = mysql_fetch_row($res))
		{
			$tables[]=$row[0];
		}
		if (in_array($table,$tables)) return true;
	}
	return false;
}

function DB_Empty($dbn)
{
	$r="DROP DATABASE `$dbn`;\nCREATE DATABASE `$dbn`;";
	MSD_DoSQL($r);

}

function sqlReturnsRecords($sql) {
	global $mysql_SQLhasRecords;
	$s=explode(' ',$sql);
	return in_array(strtoupper($s[0]),$mysql_SQLhasRecords) ? 1:0;

}

function getCountSQLStatements($sql) {
	$z=0;
	$l=strlen($sql);
	$inQuotes=false;
	for($i=0;$i<$l;$i++) {
		if ($sql[$i]=="'" || $sql[$i]=='"') $inQuotes=!$inQuotes;
		if (($sql[$i]==';' && $inQuotes==false) || $i==$l-1 ) $z++;
	}
	return $z;
}

function splitSQLStatements2Array($sql) {
	$z=0;$sqlArr=array();$tmp='';
	$sql=str_replace("\n",'',$sql);
	$l=strlen($sql);
	$inQuotes=false;
	for($i=0;$i<$l;$i++) {
		$tmp.=$sql[$i];
		if($sql[$i]=="'" || $sql[$i]=='"') $inQuotes=!$inQuotes;
		if($sql[$i]==';' && $inQuotes==false) {
			$z++;
			$sqlArr[]=$tmp;
			$tmp='';
		}
	}
	if(trim($tmp)!='') $sqlArr[]=$tmp;
	return $sqlArr;
}


function DB_Copy($source,$destination,$drop_source=0,$insert_data=1)
{
	global $config;
	if(!isset($config['dbconnection'])) MSD_mysql_connect();
	$SQL_Array=$t="";
	if(!DB_Exists($destination)) $SQL_Array.="CREATE DATABASE `$destination` ;\n";
	$SQL_Array.="USE `$destination` ;\n";
	$tabellen = mysql_list_tables($source,$config['dbconnection']);
	$num_tables = mysql_num_rows($tabellen);
	for($i=0;$i<$num_tables;$i++) {
		$table=mysql_tablename($tabellen,$i);
		$sqlt="SHOW CREATE TABLE `$source`.`$table`";
		$res=MSD_query($sqlt) or die(SQLError($sqlt,mysql_error()));
		$row=mysql_fetch_row($res);
		$c=$row[1]; if(substr($c,-1)==";") $c=substr($c,0,strlen($c)-1);
		$SQL_Array.=($insert_data==1) ? "$c SELECT * FROM `$source`.`$table` ;\n" : "$c ;\n";
	}
	if($drop_source==1) $SQL_Array.="DROP DATABASE `$source` ;";

	mysql_select_db($destination);
	MSD_DoSQL($SQL_Array);

}
function Table_Copy($source,$destination,$insert_data,$destinationdb="")
{
	global $config;
	if(!isset($config['dbconnection'])) MSD_mysql_connect();
	$SQL_Array=$t="";
	$sqlc="SHOW CREATE TABLE $source";
	$res=MSD_query($sqlc) or die(SQLError($sqlc,mysql_error()));
	$row=mysql_fetch_row($res);
	$c=$row[1];
	$a1=strpos($c,"`");
	$a2=strpos($c,"`",$a1+1);
	$c=substr($c,0,$a1+1).$destination.substr($c,$a2);
	if(substr($c,-1)==";") $c=substr($c,0,strlen($c)-1);
	$SQL_Array.=($insert_data==1) ? "$c SELECT * FROM $source ;\n" : "$c ;\n";
	//echo "<h5>$SQL_Array</h5>";
	MSD_DoSQL($SQL_Array);

}
function MSD_DoSQL($sqlcommands,$limit="")
{

	global $config,$out,$numrowsabs,$numrows,$num_befehle,$time_used,$sql;

	if(!isset($sql['parser']['sql_commands'])) $sql['parser']['sql_commands']=0;
	if(!isset($sql['parser']['sql_errors'])) $sql['parser']['sql_errors']=0;

	$sql['parser']['time_used']=getmicrotime();
	if(!isset($config['dbconnection'])) MSD_mysql_connect();
	$out=$sqlcommand="";
	$allSQL=splitSQLStatements2Array($sqlcommands);  #explode(';',preg_replace('/\r\n|\n/', '', $sqlcommands));

	$sql_queries=count($allSQL);

	if(!isset($allSQL[$sql_queries-1])) $sql_queries--;

//echo "Anzahl: ".$sql_queries;
	if($sql_queries==1)
	{
//	v($allSQL);
		SQLParser($allSQL[0]);
		$sql['parser']['sql_commands']++;
//echo $sql['parser']['sql_commands'];
		$out.=Stringformat(($sql['parser']['sql_commands']),4).": ". $allSQL[0]."\n";
		$result =MSD_query($allSQL[0]) or die(SQLError($allSQL[0],mysql_error()));
//echo "Ergebnis: ".$result;
	} else {

		for($i=0;$i<$sql_queries; $i++) {
			$allSQL[$i]=trim(rtrim($allSQL[$i]));

			if($allSQL[$i]!="") {
				$sqlcommand.=$allSQL[$i];
				$sqlcommand=SQLParser($sqlcommand);
				//echo "$i: ".htmlentities($sqlcommand)."<br>";
				if($sql['parser']['start']==0 && $sql['parser']['end']==0 && $sqlcommand!="") {
					//sql complete
					$sql['parser']['sql_commands']++;
					$out.=Stringformat(($sql['parser']['sql_commands']),4).": ". $sqlcommand."\n";
					$result =MSD_query($sqlcommand) or die(SQLError($sqlcommand,mysql_error()));
					$sqlcommand="";
				}
			}
		}
	}
	$sql['parser']['time_used']=getmicrotime()-$sql['parser']['time_used'];
}

function SQLParser($command,$debug=0)
{
	global $sql;
	$sql['parser']['start']=$sql['parser']['end']=0;
	$sql['parser']['sqlparts']=0;
	if(!isset($sql['parser']['drop'])) $sql['parser']['drop']=0;
	if(!isset($sql['parser']['create'])) $sql['parser']['create']=0;
	if(!isset($sql['parser']['insert'])) $sql['parser']['insert']=0;
	if(!isset($sql['parser']['update'])) $sql['parser']['update']=0;
	if(!isset($sql['parser']['comment'])) $sql['parser']['comment']=0;
	$Backslash=chr(92);
	$s=rtrim(trim(($command)));

	//Was ist das für eine Anfrage ?
	if(substr($s,0,1)=="#" || substr($s,0,2)=="--") {
		$sql['parser']['comment']++;
		$s="";
	} elseif(strtoupper(substr($s,0,5))=="DROP ") {
		$sql['parser']['drop']++;
	} elseif(strtoupper(substr($s,0,7))=="CREATE ") {
		//Hier nur die Anzahl der Klammern zählen
		$sql['parser']['start']=1;
		$kl1=substr_count($s,"(");
		$kl2=substr_count($s,")");
		if($kl2-$kl1==0) {
			$sql['parser']['start']=0;
			$sql['parser']['create']++;
		}
	} elseif(strtoupper(substr($s,0,7))=="INSERT " || strtoupper(substr($s,0,7))=="UPDATE ") {

		if(strtoupper(substr($s,0,7))=="INSERT ") $sql['parser']['insert']++; else $sql['parser']['update']++;
		$i=strpos(strtoupper($s)," VALUES")+7;
		$st=substr($s,$i);
		$i=strpos($st,"(")+1;
		$st=substr($st,$i);
		$st=substr($st,0,strlen($st)-2);

		$tb=explode(",",$st);
		for ($i=0;$i<count($tb);$i++){
			$first=$B_Esc=$B_Ticks=$B_Dashes=0;
			$v=trim($tb[$i]);
			//Ticks + Dashes zählen
			for($cpos=2;$cpos<=strlen($v);$cpos++)
			{if(substr($v,(-1*$cpos),1)=="'") {$B_Ticks++;} else {break;}}
			for($cpos=2;$cpos<=strlen($v);$cpos++)
			{if(substr($v,(-1*$cpos),1)=='"') {$B_Dashes++;} else {break;}}

			//Backslashes zählen
			for($cpos=2+$B_Ticks;$cpos<=strlen($v);$cpos++)
			{if(substr($v,(-1*$cpos),1)=="\\") {$B_Esc++;} else {break;}}

			if($v=="NULL" && $sql['parser']['start']==0){$sql['parser']['start']=1;$sql['parser']['end']=1;}
			if($sql['parser']['start']==0 && is_numeric($v)){$sql['parser']['start']=1;$sql['parser']['end']=1;}
			if($sql['parser']['start']==0 && substr($v,0,2)=="0X" && strpos($v," ")==false){$sql['parser']['start']=1;$sql['parser']['end']=1;}
			if($sql['parser']['start']==0 && is_object($v)){$sql['parser']['start']=1;$sql['parser']['end']=1;}

			if(substr($v,0,1)=="'"  && $sql['parser']['start']==0) {$sql['parser']['start']=1;if(strlen($v)==1)$first=1;$DELIMITER="'";}
			if(substr($v,0,1)=='"'  && $sql['parser']['start']==0) {$sql['parser']['start']=1;if(strlen($v)==1)$first=1;$DELIMITER='"';}
			if($sql['parser']['start']==1 && $sql['parser']['end']!=1 && $first==0){
				if (substr($v,-1)==$DELIMITER){
					$B_Delimiter=($DELIMITER=="'") ? $B_Ticks : $B_Dashes;
					//ist Delimiter maskiert?
					if (($B_Esc % 2)==1 && ($B_Delimiter % 2)==1  && strlen($v)>2) {

						$sql['parser']['end']=1;
					} elseif (($B_Delimiter % 2)==1 && strlen($v)>2) {
						//ist mit `'` maskiert
						$sql['parser']['end']=0;
					} elseif(($B_Esc % 2)==1) {
						//ist mit Backslash maskiert
						$sql['parser']['end']=0;
					} else {

						$sql['parser']['end']=1;
					}
				}
			}
			if($debug==1) echo "<font color='#0000FF'>".$sql['parser']['start']."/".$sql['parser']['end']."</font> Feld $i: ".htmlspecialchars($tb[$i])."<font color=#008000>- ".$sql['parser']['sqlparts']."  ($B_Ticks / $B_Esc)</font><br>";
			if($sql['parser']['start']==1 && $sql['parser']['end']==1) {
				$sql['parser']['sqlparts']++;
				$sql['parser']['start']=$sql['parser']['end']=0;
			}
		}
	}
	return $s;
}

function SQLOutput($sqlcommand,$meldung="")
{
	global $sql,$lang;
	$s= '<h6 align="center">'.$lang['sql_output'].'</h6><div id="sqloutbox"><strong>';
	//	if($meldung!="") $s.='<p class="success">'.$meldung.'</p>';
	if($meldung!="") $s.=$meldung;

	if(isset($sql['parser']['sql_commands']))
	{
		$s.=''.$sql['parser']['sql_commands'].'</strong>'.$lang['sql_commands_in'].round($sql['parser']['time_used'],4).$lang['sql_commands_in2'].'<br><br>';
		$s.=$lang['sql_out1'].'<strong>'.$sql['parser']['drop'].'</strong> <span style="color:#990099;font-weight:bold;">DROP</span>-, ';
		$s.='<strong>'.$sql['parser']['create'].'</strong> <span style="color:#990099;font-weight:bold;">CREATE</span>-, ';
		$s.='<strong>'.$sql['parser']['insert'].'</strong> <span style="color:#990099;font-weight:bold;">INSERT</span>-, ';
		$s.='<strong>'.$sql['parser']['update'].'</strong> <span style="color:#990099;font-weight:bold;">UPDATE</span>-'.$lang['sql_out2'].'<br>';
		$s.=$lang['sql_out3'].'<strong>'.$sql['parser']['comment'].'</strong> '.$lang['sql_out4'].'<br>';
		if($sql['parser']['sql_commands']<5000)
		$s.='<pre>'.Highlight_SQL($sqlcommand).'</pre></div>';
		else $s.=$lang['sql_out5']."</div>";
	}
	elseif($sqlcommand!="")$s.='<h5 align="center">'.$lang['sql_output'].'</h5><pre>'.Highlight_SQL($sqlcommand).'</pre>';
	return $s.'</div>';
}



function GetCreateTable($db,$tabelle)
{
	global $config;
	if(!isset($config['dbconnection'])) MSD_mysql_connect();
	$res=mysql_query("SHOW CREATE TABLE `$db`.`$tabelle`");
	if($res) {
		$row=mysql_fetch_array($res);
		return $row['Create Table'];
	} else return mysql_error();

}

function KindSQL($sql)
{
	if (preg_match('@^((-- |#)[^\n]*\n|/\*.*?\*/)*(DROP|CREATE)[[:space:]]+(IF EXISTS[[:space:]]+)?(TABLE|DATABASE)[[:space:]]+(.+)@im', $sql)) {
		return 2;
	} elseif (preg_match('@^((-- |#)[^\n]*\n|/\*.*?\*/)*(DROP|CREATE)[[:space:]]+(IF EXISTS[[:space:]]+)?(TABLE|DATABASE)[[:space:]]+(.+)@im', $sql)) {
		return 1;
	}
}




function GetPostParams()
{
	global $db,$dbid,$tablename,$context,$limitstart,$order,$orderdir,$sql;
	$db=$_POST['db'];
	$dbid=$_POST['dbid'];
	$tablename=$_POST['tablename'];
	$context=$_POST['context'];
	$limitstart=$_POST['limitstart'];
	$order=$_POST['order'];
	$orderdir=$_POST['orderdir'];
	$sql['sql_statement']=(isset($_POST['sql_statement'])) ? stripslashes(urldecode($_POST['sql_statement'])) : "SELECT * FROM `$tablename`";

}

function ComboCommandDump($when,$index)
{
	global $SQL_ARRAY,$nl,$databases,$lang;
	if(count($SQL_ARRAY)==0) {
		$r='<a href="sql.php?context=1" class="uls">'.$lang['sql_befehle'].'</a>';
		if($when==0)
		$r.='<input type="hidden" name="command_before_'.$index.'" value="">';
		else
		$r.='<input type="hidden" name="command_after_'.$index.'" value="">';
	} else {
		if($when==0) {
			$r='<select class="SQLCombo" name="command_before_'.$index.'">';
			$csql=$databases['command_before_dump'][$index];
		} else {
			$r='<select class="SQLCombo" name="command_after_'.$index.'">';
			$csql=$databases['command_after_dump'][$index];
		}

		$r.='<option value="" '.(($csql=="") ? " selected" : "").'>&nbsp;</option>';
		if(count($SQL_ARRAY)>0) {
			for($i=0;$i<count($SQL_ARRAY);$i++) {
				$s=str_replace('"',"'",SQL_String($i));
				$s=str_replace('"','&quot;',SQL_String($i));
				$csql=stripslashes(str_replace('"','&quot;',$csql));
				$r.='<option value="'.$s.'" '.(($csql==$s) ? " selected" : "").'>'.SQL_Name($i).'</option>'.$nl;
			}
		}

		$r.='</select>';
	}
	return $r;
}

function EngineCombo($default="")
{
	global $config;
	if(!$config['dbconnection']) MSD_mysql_connect();

	$r='<option value="" '.(($default=="") ? "selected" : "").'></option>';
	if(!MSD_NEW_VERSION) {
		//BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM
		$r.='<option value="BDB" '.(("BDB"==$default) ? "selected" : "").'>BDB</option>';
		$r.='<option value="HEAP" '.(("HEAP"==$default) ? "selected" : "").'>HEAP</option>';
		$r.='<option value="ISAM" '.(("ISAM"==$default) ? "selected" : "").'>ISAM</option>';
		$r.='<option value="InnoDB" '.(("InnoDB"==$default) ? "selected" : "").'>InnoDB</option>';
		$r.='<option value="MERGE" '.(("MERGE"==$default) ? "selected" : "").'>MERGE</option>';
		$r.='<option value="MRG_MYISAM" '.(("MRG_MYISAM"==$default) ? "selected" : "").'>MRG_MYISAM</option>';
		$r.='<option value="MYISAM" '.(("MyISAM"==$default) ? "selected" : "").'>MyISAM</option>';
	} else {
		$res=mysql_query("SHOW ENGINES");
		$num = mysql_num_rows($res);
		for($i=0;$i<$num;$i++) {
			$row=mysql_fetch_array($res);
			$r.='<option value="'.$row['Engine'].'" '.(($row['Engine']==$default) ? "selected" : "").'>'.$row['Engine'].'</option>';
		}
	}
	return $r;
}

function CharsetCombo($default="")
{
	global $config;
	if(!MSD_NEW_VERSION) { return "";
	} else {
		if(!isset($config['dbconnection'])) MSD_mysql_connect();
		$res=mysql_query("SHOW Charset");
		$num = mysql_num_rows($res);
		$r='<option value="" '.(($default=="") ? "selected" : "").'></option>';
		$charsets=array();
		for($i=0;$i<$num;$i++) {
			$charsets[]=mysql_fetch_array($res);
		}

		if (is_array($charsets))
		{
			$charsets=mu_sort($charsets,'Charset');
			foreach ($charsets as $row)
			{
				$r.='<option value="'.$row['Charset'].'" '.(($row['Charset']==$default) ? "selected" : "").'>'.$row['Charset'].'</option>';
			}
		}
		return $r;
	}
}

function GetCollationArray()
{
	global $config;
	if(!isset($config['dbconnection'])) MSD_mysql_connect();

	$res=mysql_query("SHOW Collation");
	$num = @mysql_num_rows($res);
	$r=Array();
	if (is_array($r))
	{
		for($i=0;$i<$num;$i++)
		{
			$row=mysql_fetch_array($res);
			$r[$i]['Collation']=isset($row['Collation']) ? $row['Collation']:'';
			$r[$i]['Charset']=isset($row['Charset']) ? $row['Charset']:'';
			$r[$i]['Id']=isset($row['Id']) ? $row['Id']:'';
			$r[$i]['Default']=isset($row['Default']) ? $row['Default']:'';
			$r[$i]['Compiled']=isset($row['Compiled']) ? $row['Compiled']:'';
			$r[$i]['Sortlen']=isset($row['Sortlen']) ? $row['Sortlen']:'';
		}
	}
	return $r;
}

function CollationCombo($default="",$withcharset=0)
{
	if(!MSD_NEW_VERSION) {
		return "";
	} else {
		$r=GetCollationArray();
		sort($r);
		$s="";
		$s='<option value="" '.(($default=="") ? "selected" : "").'></option>';
		$group="";
		for($i=0;$i<count($r);$i++) {
			$gc=$r[$i]['Charset'];
			if($gc!=$group) {
				$group=$gc;
				if($i>0) $s.='</optgroup>';
				$s.='<optgroup label="'.$group.'">';
			}
			$s.='<option value="'.(($withcharset==1) ? $group.'|' : '').$r[$i]['Collation'].'" '.(($r[$i]['Collation']==$default) ? "selected" : "").'>'.$r[$i]['Collation'].'</option>';
		}
		return $s.'</optgroup>';
	}
}
function AttributeCombo($default="")
{
	$s='<option value="" '.(($default=="") ? "selected" : "").'></option>';
	$s.='<option value="unsigned" '.(($default=="unsigned") ? "selected" : "").'>unsigned</option>';
	$s.='<option value="unsigned zerofill" '.(($default=="unsigned zerofill") ? "selected" : "").'>unsigned zerofill</option>';
	return $s;

}

function simple_bbcode_conversion($a)
{
	global $config;
	$tag_start='';
	$tag_end='';

	//replacements
	$a=nl2br($a);
	$a=str_replace('<br>',' <br>',$a);
	$a=str_replace('<br />',' <br>',$a);

	$a=preg_replace("/\[url=(.*?)\](.*?)\[\/url\]/si","<a class=\"small\"  href=\"$1\" target=\"blank\">$2</a>",$a);
	$a=preg_replace("/\[urltargetself=(.*?)\](.*?)\[\/urltargetself\]/si","<a class=\"small\"  href=\"$1\" target=\"blank\">$2</a>",$a);
	$a=preg_replace("/\[url\](.*?)\[\/url\]/si","<a class=\"small\"  href=\"$1\" target=\"blank\">$1</a>",$a);
	$a=preg_replace("/\[ed2k=\+(.*?)\](.*?)\[\/ed2k\]/si","<a class=\"small\"  href=\"$1\" target=\"blank\">$2</a>",$a);
	$a=preg_replace("/\[ed2k=(.*?)\](.*?)\[\/ed2k\]/si","<a class=\"small\"  href=\"$1\" target=\"blank\">$2</a>",$a);

	$a=preg_replace("/\[center\](.*?)\[\/center\]/si", "<div align=\"center\">$1</div>", $a);
	$a=preg_replace("/\[size=([1-2]?[0-9])\](.*?)\[\/size\]/si", "<span style=\"font-size=$1px;\">$2</span>", $a);
	$a=preg_replace("/\[size=([1-2]?[0-9]):(.*?)\](.*?)\[\/size(.*?)\]/si", "<span style=\"font-size=$1px;\">$3</span>", $a);
	$a=preg_replace("/\[font=(.*?)\](.*?)\[\/font\]/si", "<span style=\"font-family:$1;\">$2</span>", $a);
	$a=preg_replace("/\[color=(.*?)\](.*?)\[\/color\]/si", "<span style=\"color=$1;\">$2</span>", $a);
	$a=preg_replace("/\[color=(.*?):(.*?)\](.*?)\[\/color(.*?)\]/si", "<span style=\"color=$1;\">$3</span>", $a);
	$a=preg_replace("/\[img\](.*?)\[\/img\]/si", "<img src=\"$1\" vspace=4 hspace=4>", $a);
	//$a=preg_replace("/\[b\](.*?)\[\/b\]/si", "<strong>$1</strong>", $a);
	$a=preg_replace("/\[b(.*?)\](.*?)\[\/b(.*?)\]/si", "<strong>$2</strong>", $a);
	//$a=preg_replace("/\[u\](.*?)\[\/u\]/si", "<u>$1</u>", $a);
	$a=preg_replace("/\[u(.*?)\](.*?)\[\/u(.*?)\]/si", "<u>$2</u>", $a);
	//$a=preg_replace("/\[i\](.*?)\[\/i\]/si", "<em>$1</em>", $a);
	$a=preg_replace("/\[i(.*?)\](.*?)\[\/i(.*?)\]/si", "<em>$2</em>", $a);
	//$a=preg_replace("/\[quote\](.*?)\[\/quote\]/si", "<p align=\"left\" style=\"border: 2px solid silver;padding:4px;\">$1</p>", $a);
	$a=preg_replace("/\[quote(.*?)\](.*?)\[\/quote(.*?)\]/si", "<p align=\"left\" style=\"border: 2px solid silver;padding:4px;\">$2</p>", $a);
	$a=preg_replace("/\[code(.*?)\](.*?)\[\/code(.*?)\]/si", "<p align=\"left\" style=\"border: 2px solid red;color:green;padding:4px;\">$2</p>", $a);
	$a=preg_replace("/\[hide\](.*?)\[\/hide\]/si", "<div style=\"background-color:#ccffcc;\">$1</div>", $a);
	$a=preg_replace("/(^|\s)+((http:\/\/)|(www.))(.+)(\s|$)+/Uis"," <a href=\"http://$4$5\" target=\"_blank\">http://$4$5</a> ",$a);
	return $tag_start.$a.$tag_end;
}

function ExtractTablename($q)
{
	$offset=0;
	if (strlen($q)>100) $q=substr(0,100,$q);

	$p=strtoupper($q);
	$i=strpos($p,"FROM")+5;
	$p=substr($p,$i);
	if(substr($p,0,1)=="("){
		$offset=2;
		//echo "$offset<br>";
	}
	if(strpos($p," ",$offset)) {
		$j=strpos($p," ",$offset);
		$p=substr($p,$offset,$j);
	}
	$t=substr($q,$i+$offset,strlen($p)-$offset);
	if(substr($t,-1)==",") {
		//Achtung, keine eindeutige Tabelle
		$t='';
	}
	if(substr($t,0,1)=="`" && substr($t,-1)=="`") $t=substr($t,1,strlen($t)-2);
	return $t;
}

function ExtractTablenameFromSQL($q)
{
	global $databases;
	$table='';
	if (strlen($q)>100) $q=substr(0,100,$q);
	$p=trim($q);
	$first=substr($p,0,strpos($p," "));
	$suchen=array('SHOW TABLE STATUS ','SHOW TABLE','SELECT','DROP','INSERT','UPDATE','DELETE');
	$ersetzen=array('','','','','','','');
	$cleaned=trim(str_ireplace($suchen,$ersetzen,$p));

	switch($first)
	{
		case "SHOW":
			//	$table='';
			//	break;
		case "SELECT":
		case "DROP":
		case "INSERT":
		case "UPDATE":
		default:
			$table=$first;
			$p=substr($cleaned,stripos($cleaned,"FROM ")+5);
			//echo "<br>P ist jetzt: ".$p;
			$p=explode(' ',$p);
			//echo "<br>Array p ist: ".v($p);

			$t=$p[0];
			if(strpos($t,".")) $t=substr($t, strpos($t,".")+1);
			$table=str_replace("`","",$t);
			//echo "<br>Tabelle extrahiert: ".$table;
			break;
	}
	// So, dann wollen wir doch mal nachsehen, ob es die ermittelte Tabelle ueberhaupt gibt
	if (Table_Exists($databases['db_actual'],$table)) return $table;
	else return "";
}

function GetOptionsCombo($arr,$default)
{
	global $feldtypen,$feldattribute,$feldnull,$feldextras,$feldkeys,$feldrowformat;
	$r="";
	foreach ($arr as $s) {
		$r.='<option value="'.$s.'" '.((strtoupper($default)==strtoupper($s)) ? "selected" : "" ).'>'.$s.'</option>'."\n";
	}
	return $r;
}

function make_options($arr,$selected)
{
	$r='';
	foreach ($arr as $key=>$val)
	{
		$r.='<option value="'.$key.'"';
		if ($key==$selected) $r.=' selected';
		$r.='>'.$val.'</option>'."\n";
	}
	return $r;
}


function FillFieldinfos($db,$tabelle)
{
	global $config;

	$fields_infos=Array();

	$t=GetCreateTable($db,$tabelle);
	$sqlf="SHOW FULL FIELDS FROM `$db`.`$tabelle`;";
	$res=MSD_query($sqlf) or die(SQLError($sqlf,mysql_error()));
	$anz_fields=mysql_num_rows($res);

	for($i=0;$i<$anz_fields;$i++) {
		$row=mysql_fetch_array($res);
		$fields_infos[$i]['collate']=isset($row['Collation']) ? $row['Collation'] : '';
		if (isset($row['COLLATE'])) $fields_infos[$i]['collate']=$row['COLLATE']; // MySQL <4.1
		if(isset($row['Comment'])) $fields_infos[$i]['comment']=$row['Comment'];
		$fields_infos[$i]['privileges']=$row['Privileges'];
		$fields_infos[$i]['type']=$row['Type'];

	}
	$fields_infos['_primarykey_']="";
	$flds=$keys=$ukeys=$fkeys=0;
	$fields_infos['_createtable_']=$t;
	$tmp=explode("\n",$t);
	for($i=1;$i<count($tmp)-1;$i++) {
		$t=trim($tmp[$i]);
		if(substr($t,-1)==",") $t=substr($t,0,strlen($t)-1);
		//echo $t."<br>";

		if(substr($t,0,12)=="PRIMARY KEY ") {
			$t=str_replace("`","",$t);
			$fields_infos['_primarykey_']=substr($t,strpos($t,"(")+1,strpos($t,")")-strpos($t,"(")-1);
		} elseif (substr($t,0,4)=="KEY ") {
			$t=str_replace("`","",$t);
			$att=explode(" ",$t);
			$fields_infos['_key_'][$keys]['name']=$att[1];
			$att[2]=str_replace("(","",$att[2]);
			$att[2]=str_replace(")","",$att[2]);
			$fields_infos['_key_'][$keys]['columns']=$att[2];
			$keys++;
		} elseif (substr($t,0,11)=="UNIQUE KEY ") {
			$t=str_replace("`","",$t);
			$att=explode(" ",$t);
			$fields_infos['_uniquekey_'][$ukeys]['name']=$att[2];
			$att[3]=str_replace("(","",$att[3]);
			$att[3]=str_replace(")","",$att[3]);
			$fields_infos['_uniquekey_'][$ukeys]['columns']=$att[3];
			$ukeys++;
		} elseif (substr($t,0,13)=="FULLTEXT KEY ") {
			$t=str_replace("`","",$t);
			$att=explode(" ",$t);
			$fields_infos['_fulltextkey_'][$fkeys]['name']=$att[2];
			$att[3]=str_replace("(","",$att[3]);
			$att[3]=str_replace(")","",$att[3]);
			$fields_infos['_fulltextkey_'][$fkeys]['columns']=$att[3];
			$fkeys++;
		} else {

			$att=explode(" ",$t);

			if(substr($att[0],0,1)=="`" && substr($att[0],-1)=="`") {
				$fields_infos[$flds]['name']=str_replace("`","",$att[0]);
				$s=1;
			} else {
				$fields_infos[$flds]['name']=str_replace("`","",$att[0])." ";
				for($ii=1;$i<count($att);$i++) {
					if(substr($att[$ii],-1)!="`") {
						$fields_infos[$flds]['name'].=$att[$ii];
					} else {
						$fields_infos[$flds]['name'].=str_replace("`","",$att[$ii]);
						$s=$ii+1;
						break;
					}
				}
			}

			$fields_infos[$flds]['type']=(strpos($att[$s],"(")) ? substr($att[$s],0,strpos($att[$s],"(")) : $att[$s];
			$fields_infos[$flds]['size']=(strpos($att[$s],"(")) ? substr($att[$s],strpos($att[$s],"(")+1,strpos($att[$s],")")-strpos($att[$s],"(")-1) : "";
			$fields_infos[$flds]['default']="";
			$fields_infos[$flds]['null']="";
			$fields_infos[$flds]['extra']="";
			$fields_infos[$flds]['attribut']="";

			$s++;
			while($s<count($att)) {
				if(isset($att[$s+1]) && strtolower($att[$s].$att[$s+1])=="unsignedzerofill") {
					$fields_infos[$flds]['attribut']="unsigned zerofill";
					$s+=2;
				} elseif(strtolower($att[$s])=="unsigned") {
					$fields_infos[$flds]['attribut']="unsigned";
					$s++;
				} elseif(isset($att[$s+1]) && strtolower($att[$s].$att[$s+1])=="notnull") {
					$fields_infos[$flds]['null']="NOT NULL";
					$s+=2;
				}  elseif(strtolower($att[$s])=="null") {
					$fields_infos[$flds]['null']="NULL";
					$s++;
				}  elseif(strtolower($att[$s])=="auto_increment") {
					$fields_infos[$flds]['extra']="auto_increment";
					$s++;
				}  elseif(strtolower($att[$s])=="collate") {
					$fields_infos[$flds]['collate']=$att[$s+1];
					$s+=2;
				}  elseif(strtolower($att[$s])=="character") {
					$fields_infos[$flds]['character set']=$att[$s+2];
					$s+=3;
				}  elseif(strtolower($att[$s])=="default") {
					//if(strpos(strtolower($fields_infos[$flds]['type']),"text")===false && strtolower($fields_infos[$flds]['type'])!="varchar")
					$d="";$ii=$s+1;
					if(substr($att[$ii],0,1)=="'" && substr($att[$ii],-1)=="'") {
						$fields_infos[$flds]['default']=$att[$ii];
						$s+=2;
					} else {
						if(substr($att[$ii],0,1)=="'") {
							$fields_infos[$flds]['default']=$att[$ii]." ".$att[$ii+1];
							$s+=3;
						} else {
							$fields_infos[$flds]['default']=$att[$ii];
							$s+=2;
						}
					}
				} else {
					//echo "not identified: $att[$s]<br>";
					$s++;
				}
			}

			$flds++;
		}
	}
	//echo substr($tmp[count($tmp)-1],2)."<br>";
	$ext=explode(" ",substr($tmp[count($tmp)-1],2));
	$s="";$haltchar="=";
	for($i=0;$i<count($ext);$i++) {
		if(!strpos($ext[$i],$haltchar)) {
			$s.=$ext[$i]." ";
		} else {
			if($haltchar=="'") {
				$fields_infos['_tableinfo_']['COMMENT']=$s.$ext[$i];
				$s="";$haltchar="=";
			} else {
				$s.=substr($ext[$i],0,strpos($ext[$i],$haltchar));
				if(strtoupper($s)=="COMMENT") {
					$s=substr($ext[$i],strpos($ext[$i],$haltchar)+1);
					if(substr($s,-1)=="'") {
						$fields_infos['_tableinfo_']['COMMENT']=$s;
						$s="";
					} else {
						$s.=" ";
						$haltchar="'";
					}
				} else {
					$fields_infos['_tableinfo_'][strtoupper($s)]=substr($ext[$i],strpos($ext[$i],$haltchar)+1);
					$s="";
				}
			}
		}
	}
	return $fields_infos;
}

function ChangeKeys($ok,$nk,$fld,$size,$restriction="")
{
	if($ok[0]==$nk[0] && $ok[1]==$nk[1] && $ok[2]==$nk[2] && $ok[3]==$nk[3])
	return "";
	else {
		$s=""; //"$ok[0] | $ok[1] | $ok[2] | $ok[3] *** $nk[0] | $nk[1] |$nk[2] | $nk[3]<br>";

		if($ok[0]==0 && $nk[0]==1) {
			if($restriction!="drop_only") $s.="ADD PRIMARY KEY (`$fld`), ";
		} elseif ($ok[0]==1 && $nk[0]==0) {
			$s.="DROP PRIMARY KEY, ";
		}
		if($ok[1]==0 && $nk[1]==1) {
			if($restriction!="drop_only") $s.="ADD UNIQUE INDEX `$fld` (`$fld`), ";
		} elseif ($ok[1]==1 && $nk[1]==0) {
			$s.="DROP INDEX `$fld`, ";
		}
		if($ok[2]==0 && $nk[2]==1) {
			if($restriction!="drop_only") $s.="ADD INDEX `$fld` (`$fld`), ";
		} elseif ($ok[2]==1 && $nk[2]==0) {
			$s.="DROP INDEX `$fld`, ";
		}
		if($ok[3]==0 && $nk[3]==1) {
			if($restriction!="drop_only") $s.="ADD FULLTEXT INDEX `$fld` (`$fld`($size)), ";
		} elseif ($ok[3]==1 && $nk[3]==0) {
			$s.="DROP FULLTEXT INDEX `$fld`, ";
		}
	}
	if($s!="") $s=substr($s,0,strlen($s)-2);
	return $s;
}

function CheckCSVOptions()
{
	global $sql;
	if(!isset($sql['export']['trenn'])) $sql['export']['trenn']=";";
	if(!isset($sql['export']['enc'])) $sql['export']['enc']="\"";
	if(!isset($sql['export']['esc'])) $sql['export']['esc']="\\";
	if(!isset($sql['export']['ztrenn'])) $sql['export']['ztrenn']="\\r\\n";
	if(!isset($sql['export']['null'])) $sql['export']['null']="NULL";
	if(!isset($sql['export']['namefirstline'])) $sql['export']['namefirstline']=0;
	if(!isset($sql['export']['format'])) $sql['export']['format']=0;
	if(!isset($sql['export']['sendfile'])) $sql['export']['sendfile']=0;
	if(!isset($sql['export']['tables'])) $sql['export']['tables']=Array();
	if(!isset($sql['export']['compressed'])) $sql['export']['compressed']=0;
	if(!isset($sql['export']['htmlstructure'])) $sql['export']['htmlstructure']=0;
	if(!isset($sql['export']['xmlstructure'])) $sql['export']['xmlstructure']=0;

	if(!isset($sql['import']['trenn'])) $sql['import']['trenn']=";";
	if(!isset($sql['import']['enc'])) $sql['import']['enc']="\"";
	if(!isset($sql['import']['esc'])) $sql['import']['esc']="\\";
	if(!isset($sql['import']['ztrenn'])) $sql['import']['ztrenn']="\\r\\n";
	if(!isset($sql['import']['null'])) $sql['import']['null']="NULL";
	if(!isset($sql['import']['namefirstline'])) $sql['import']['namefirstline']=0;
	if(!isset($sql['import']['format'])) $sql['import']['format']=0;


}

function ExportCSV() {
	global $sql,$config;
	$t="";
	$time_start = time();
	if(!isset($config['dbconnection'])) MSD_mysql_connect();
	for($table=0;$table<count($sql['export']['tables']);$table++) {
		$sqlt="SHOW Fields FROM `".$sql['export']['db']."`.`".$sql['export']['tables'][$table]."`;";
		$res=MSD_query($sqlt) or die(SQLError($sqlt,mysql_error()));
		if($res) {
			$numfields=mysql_numrows($res);
			if($sql['export']['namefirstline']==1) {
				for($feld=0;$feld<$numfields;$feld++) {
					$row=mysql_fetch_row($res);
					if($sql['export']['enc']!="")
					$t.=$sql['export']['enc'].$row[0].$sql['export']['enc'].(($feld+1<$numfields) ? $sql['export']['trenn'] : '');
					else
					$t.=$row[0].(($feld+1<$numfields) ? $sql['export']['trenn'] : '');
				}
				$t.=$sql['export']['endline'];
				$sql['export']['lines']++;
			}
		}
		$sqlt="SELECT * FROM `".$sql['export']['db']."`.`".$sql['export']['tables'][$table]."`;";
		$res=MSD_query($sqlt) or die(SQLError($sqlt,mysql_error()));
		if($res) {
			$numrows=mysql_numrows($res);
			for($data=0;$data<$numrows;$data++) {
				$row=mysql_fetch_row($res);
				for($feld=0;$feld<$numfields;$feld++) {
					if(!isset($row[$feld]) || is_null($row[$feld])) {
						$t.=$sql['export']['null'];
					} elseif($row[$feld]=='0' || $row[$feld]!='') {
						if($sql['export']['enc']!="")
						$t.=$sql['export']['enc'].str_replace($sql['export']['enc'],$sql['export']['esc'].$sql['export']['enc'],$row[$feld]).$sql['export']['enc'];
						else
						$t.=$row[$feld];
					} else {
						$t.='';
					}
					$t.=($feld+1<$numfields) ? $sql['export']['trenn'] : '';
				}
				$t.=$sql['export']['endline'];
				$sql['export']['lines']++;
				if(strlen($t)>$config['memory_limit']) {
					CSVOutput($t);
					$t="";
				}
				$time_now = time();
				if ($time_start >= $time_now + 30) {
					$time_start = $time_now;
					header('X-MSDPing: Pong');
				}
			}
		}
	}
	CSVOutput($t,1);
}

function CSVOutput($str,$last=0)
{
	global $sql,$config;
	if($sql['export']['sendfile']==0) {
		//Display
		echo $str;
	} else {
		if($sql['export']['header_sent']=="") {
			if($sql['export']['compressed']==1 & !function_exists('gzencode')) $sql['export']['compressed']=0;
			if($sql['export']['format']<4) {
				$file=$sql['export']['db'].(($sql['export']['compressed']==1) ? ".csv.gz" : ".csv");
			} elseif($sql['export']['format']==4) {
				$file=$sql['export']['db'].(($sql['export']['compressed']==1) ? ".xml.gz" : ".xml");
			} elseif($sql['export']['format']==5) {
				$file=$sql['export']['db'].(($sql['export']['compressed']==1) ? ".html.gz" : ".html");
			}
			$mime=($sql['export']['compressed']==0) ? "x-type/subtype" : "application/x-gzip";

			header('Content-Disposition: attachment; filename="' . $file . '"');
			header('Pragma: no-cache');
			header('Content-Type: '.$mime);
			header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT');
			$sql['export']['header_sent']=="1";
		}
		if($sql['export']['compressed']==1)
		echo gzencode($str);
		else
		echo $str;

	}
}

function DoImport() {
	global $sql,$lang;
	$r='<span class="swarnung">';
	$zeilen=count($sql['import']['csv'])-$sql['import']['namefirstline'];
	$sql['import']['first_zeile']=explode($sql['import']['trenn'],$sql['import']['csv'][0]);
	$importfelder=count($sql['import']['first_zeile']);

	if($sql['import']['tablecreate']==0) {
		$res=MSD_query("show fields FROM ".$sql['import']['table']);
		$tabellenfelder=mysql_num_rows($res);
		if($importfelder!=$tabellenfelder) {
			$r.='<br>'.sprintf($lang['csv_fieldcount_nomatch'],$tabellenfelder,$importfelder);
		} else {
			$ok=1;
		}
	} else {
		$ok=ImportCreateTable();
		if($ok==0) {
			$r.='<br>'.sprintf($lang['csv_errorcreatetable'],$sql['import']['table']);
		}
	}
	if($ok==1) {
		$insert="";
		if($sql['import']['emptydb']==1 && $sql['import']['tablecreate']==0) {
			MSD_DoSQL("TRUNCATE ".$sql['import']['table'].";");
		}
		$sql['import']['lines_imported']=0;
		$enc=($sql['import']['enc']=="") ? "'" : "";
		$zc="";
		for($i=$sql['import']['namefirstline'];$i<$zeilen+$sql['import']['namefirstline'];$i++) {
			//Importieren
			$insert="INSERT INTO ".$sql['import']['table']." VALUES(";
			if($sql['import']['createindex']==1) $insert .="'', ";
			$zc.=trim(rtrim($sql['import']['csv'][$i]));
			echo "Zeile $i: $zc<br>";
			if($zc!="" && substr($zc,-1)==$enc) {
				$zeile=explode($sql['import']['trenn'],$zc);
				for($j=0;$j<$importfelder;$j++) {
					$a=($zeile[$j]=="" && $enc=="") ? "''" : $zeile[$j];
					$insert.=$enc.$a.$enc.(($j==$importfelder-1) ? ");\n" : ",");
				}
				//MSD_DoSQL($insert);
				$sql['import']['lines_imported']++;
				$zc="";
			}

		}
		$r.=sprintf($lang['csv_fieldslines'],$importfelder,$sql['import']['lines_imported']);
	}

	$r.='</span>';
	return $r;

}

function ImportCreateTable() {
	global $sql,$lang,$db,$config;
	$tbl=Array();
	$tabellen = mysql_list_tables($db,$config['dbconnection']);
	$num_tables = mysql_num_rows($tabellen);
	for($i=0;$i<$num_tables;$i++) {
		$tbl[]=strtolower(mysql_tablename($tabellen,$i));
	}
	$i=0;
	$sql['import']['table']=$sql['import']['table'].$i;
	while(in_array($sql['import']['table'],$tbl)) {
		$sql['import']['table']=substr($sql['import']['table'],0,strlen($sql['import']['table'])-1).++$i;
	}
	$create="CREATE TABLE `".$sql['import']['table']."` (".(($sql['import']['createindex']==1) ? '`import_id` int(11) unsigned NOT NULL auto_increment, ' : '');
	if($sql['import']['namefirstline']) {
		for($i=0;$i<count($sql['import']['first_zeile']);$i++) {
			$create.='`'.$sql['import']['first_zeile'][$i].'` VARCHAR(250) NOT NULL, ';
		}
	} else {
		for($i=0;$i<count($sql['import']['first_zeile']);$i++) {
			$create.='`FIELD_'.$i.'` VARCHAR(250) NOT NULL, ';
		}
	}
	if($sql['import']['createindex']==1)
	$create.='PRIMARY KEY (`import_id`) ';
	else
	$create=substr($create,0,strlen($create)-2);

	$create.=') '.((MSD_NEW_VERSION) ? 'ENGINE' : 'TYPE')."=MyISAM COMMENT='imported at ".date("l dS of F Y H:i:s A")."'";
	$res=mysql_query($create,$config['dbconnection']) || die(SQLError($create,mysql_error()));
	return 1;
}

function ExportXML() {
	global $sql,$config;
	$tab="\t";
	$level=0;
	$t='<?xml version="1.0" encoding="UTF-8" ?>'."\n".'<database name="'.$sql['export']['db'].'">'."\n";
	$level++;
	$time_start = time();

	if(!isset($config['dbconnection'])) MSD_mysql_connect();
	for($table=0;$table<count($sql['export']['tables']);$table++) {
		$t.=str_repeat($tab,$level++).'<table name="'.$sql['export']['tables'][$table].'">'."\n";
		$sqlt="SHOW Fields FROM `".$sql['export']['db']."`.`".$sql['export']['tables'][$table]."`;";
		$res=MSD_query($sqlt) or die(SQLError($sqlt,mysql_error()));
		if($res) {
			$numfields=mysql_num_rows($res);
			if($sql['export']['xmlstructure']==1){
				$t.=str_repeat($tab,$level++).'<structure>'."\n";
				for($feld=0;$feld<$numfields;$feld++) {
					$row=mysql_fetch_array($res);
					$t.=str_repeat($tab,$level++).'<field no="'.$feld.'">'."\n";
					$t.=str_repeat($tab,$level).'<name>'.$row['Field'].'</name>'."\n";
					$t.=str_repeat($tab,$level).'<type>'.$row['Type'].'</type>'."\n";
					$t.=str_repeat($tab,$level).'<null>'.$row['Null'].'</null>'."\n";
					$t.=str_repeat($tab,$level).'<key>'.$row['Key'].'</key>'."\n";
					$t.=str_repeat($tab,$level).'<default>'.$row['Default'].'</default>'."\n";
					$t.=str_repeat($tab,$level).'<extra>'.$row['Extra'].'</extra>'."\n";
					$t.=str_repeat($tab,--$level).'</field>'."\n";
				}
				$t.=str_repeat($tab,--$level).'</structure>'."\n";
			}
		}
		$t.=str_repeat($tab,$level++).'<data>'."\n";
		$sqlt="SELECT * FROM `".$sql['export']['db']."`.`".$sql['export']['tables'][$table]."`;";
		$res=MSD_query($sqlt) or die(SQLError($sqlt,mysql_error()));
		if($res) {
			$numrows=mysql_numrows($res);
			for($data=0;$data<$numrows;$data++) {
				$t.=str_repeat($tab,$level)."<row>\n";
				$level++;
				$row=mysql_fetch_row($res);
				for($feld=0;$feld<$numfields;$feld++) {
					$t.=str_repeat($tab,$level).'<field no="'.$feld.'">'.$row[$feld].'</field>'."\n";
				}
				$t.=str_repeat($tab,--$level)."</row>\n";
				$sql['export']['lines']++;
				if(strlen($t)>$config['memory_limit']) {
					CSVOutput($t);
					$t="";
				}
				$time_now = time();
				if ($time_start >= $time_now + 30) {
					$time_start = $time_now;
					header('X-MSDPing: Pong');
				}
			}
		}
		$t.=str_repeat($tab,--$level).'</data>'."\n";
		$t.=str_repeat($tab,--$level).'</table>'."\n";
	}
	$t.=str_repeat($tab,--$level).'</database>'."\n";
	CSVOutput($t,1);
}

function ExportHTML() {
	global $sql,$config,$lang;

	$header=implode("",file($config['paths']['config'].'html_template'));
	$header=str_replace("{TITLE}",'MSD HTML-Export',$header);
	$footer="\n\n</body>\n</html>";
	$content="";
	$content.='<h1>Datenbank '.$sql['export']['db'].'</h1>';

	$time_start = time();

	if(!isset($config['dbconnection'])) MSD_mysql_connect();
	for($table=0;$table<count($sql['export']['tables']);$table++) {
		$content.='<h2>Tabelle '.$sql['export']['tables'][$table].'</h2>'."\n";
		$fsql="show fields from `".$sql['export']['tables'][$table]."`";
		$dsql="select * from `".$sql['export']['tables'][$table]."`";
		//Struktur
		$res=MSD_query($fsql) or die(SQLError($fsql,mysql_error()));
		if($res) {
			$field=$fieldname=$fieldtyp=Array();
			$structure="<table class=\"Table\">\n";
			$numfields=mysql_numrows($res);
			for($feld=0;$feld<$numfields;$feld++) {
				$row=mysql_fetch_row($res);
				$field[$feld]=$row[0];

				if($feld==0) {
					$structure.="<tr class=\"Header\">\n";
					for($i=0;$i<count($row);$i++) {
						$str = mysql_fetch_field($res,$i);
						$fieldname[$i]=$str->name;
						$fieldtyp[$i]=$str->type;
						$structure.="<th>".$str->name."</th>\n";
					}
					$structure.="</tr>\n<tr>\n";
				}
				for($i=0;$i<count($row);$i++) {
					$structure.="<td class=\"Object\">".(($row[$i]!="") ? $row[$i] : "&nbsp;")."</td>\n";
				}
				$structure.="</tr>\n";
			}
			$structure.="</table>\n";
		}
		if($sql['export']['htmlstructure']==1) $content.="<h3>Struktur</h3>\n".$structure;
		//Daten

		$res=MSD_query($dsql) or die(SQLError($dsql,mysql_error()));
		if($res) {
			$anz=mysql_num_rows($res);
			$content.="<h3>Daten ($anz Datens&auml;tze)</h3>\n";
			$content.="<table class=\"Table\">\n";
			for($feld=0;$feld<count($field);$feld++) {
				if($feld==0) {
					$content.="<tr class=\"Header\">\n";
					for($i=0;$i<count($field);$i++) {
						$content.="<th>".$field[$i]."</th>\n";
					}
					$content.="</tr>\n";
				}
			}
			for($d=0;$d<$anz;$d++) {
				$row=mysql_fetch_row($res);
				$content.="<tr>\n";
				for($i=0;$i<count($row);$i++) {

					$content.='<td class="Object">'.(($row[$i]!="") ? $row[$i] : "&nbsp;")."</td>\n";
				}
				$content.="</tr>\n";
			}
		}
		$content.="</table>";
	}
	CSVOutput($header.$content.$footer);
}


// Bildet die WHERE-Bedingung zur eindeutigen Identifizierung wenn kein Primaerschluessel vorhanden ist
// erwartet ein Array mit $data[feldname]=wert
function build_recordkey($data)
{
	if (!is_array($data)) return urlencode($data);
	else return urlencode(serialize($data));
}


function build_where_from_record($data)
{
	if (!is_array($data)) return false;
	$ret='';
	foreach ($data as $key=>$val)
	{
		$val=str_replace('<span class="treffer">','',$val);
		$val=str_replace('</span>','',$val);
		$ret.='`'.$key.'`="'.addslashes($val).'"|';
	}
	$ret=substr($ret,0,-1);
	return $ret;
}
?>
